
package database;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JeppeJensen
 */
public final class DatabaseHandler {

    private Connection conn;
    private Statement stmt;
    private String host;
    private int portnr;
    private String database;
    private String udb;
    private String pdb;

    private static DatabaseHandler instance;

    /**
     * Opretter et nyt SQLCommunication-objekt.
     *
     * @throws IOException hvis Der er sket en fejl ved indlæsning af ini-filen.
     * Man bruger bare default til at logge på MySQL-serveren.
     */
    public DatabaseHandler(){
        /*------------------DATABASEINFO---------------------*/
        /**/ host = "localhost";                           /**/
        /**/ portnr = 3306;                                /**/
        /**/ database = "quizkampen";                      /**/
        /**/ udb = "root"; //username til database         /**/
        /**/ pdb = "karen";  //Password til database.       /**/ 
        /*---------------------------------------------------*/        
    }

    public static DatabaseHandler getInstance() {
        if (instance == null) {
            instance = new DatabaseHandler();           
        }
        return instance;
    }

    /**
     * Select-metoden bør blot returnere et resultset som vi så skal bearbejde
     * med en while(rs.next) i den klasse man kalder den i.
     *
     * @param tabel
     * @param sql-streng som man vil køre
     * @returnerer det resultset som der er bedt om hvis der ikke er blevet
     * kastet en exception.. Ellers vil 'null' blive returneret
     * @throws SQLException hvis der er sket en fejl ved hentning fra 'tabel' i
     * databasen.
     */
    public ResultSet select(String sql) throws SQLException {
        ResultSet rs = null;
        if (conn == null) {
            System.out.println("Der er ikke oprettet forbindelse mod databasen.");
        } else {
            rs = stmt.executeQuery(sql);
        }
        return rs;
    }

    /**
     * Slet fra en bestemt tabel
     *
     * @param tabel
     * @param sql
     * @throws SQLException hvis der er sket en fejl i forbindelse med sletning
     * fra 'tabel'
     */
    public void execute(String sql) throws SQLException {
        stmt.execute(sql);
        System.out.println(sql + " er nu afviklet");
    }
    
    // <editor-fold defaultstate="collapsed" desc="Specialiserede metoder">
    public void openConn() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://" + host + ":" + portnr + "/" + database; //HUSK AT ÆNDRE PORT
        conn = DriverManager.getConnection(url, udb, pdb); //HUSK AT ÆNDRE PASSWORD HVIS DET IKKE ER DET SAMME
        stmt = conn.createStatement();
        System.out.println("Connection er oprettet!");
    }

    public boolean isConnectionClosed() {
        boolean closed = false;
        try {
            if (conn!=null){
                closed = conn.isClosed();
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Fejl ved tjek af connection i SQL-Communication");
        }
        return closed;
    }

    public void closeConn() {
        try {
            conn.close();
        } catch (SQLException ex) {
            System.out.println("Forsøg på conn.close(). Der er ingen connections åbne");
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="SET - metoder">
    public void setPortnr(int portnr) {
        this.portnr = portnr;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public void setUdb(String udb) {
        this.udb = udb;
    }

    public void setPdb(String pdb) {
        this.pdb = pdb;
    }
    // </editor-fold>
}
